package test_pkg

//多协程处理的一种常见场景 解决流水线算法的性能问题

//假设我们必须处理大量的彼此独立的数据项，通过一个输入通道进入，
//并且全部处理完成后放到一个输出通道，就像一个工厂的管道。
//每个数据项的处理也许会涉及多个步骤： 预处理 / 步骤 A / 步骤 B / … / 后期处理

//常见的流水线处理模式
// 一次只执行一步，并且每个项目按顺序处理：在第一个项目被处理完并将结果放到输出通道之前第二个项目不会开始
//通常 这会非常浪费时间

/* func SerialProcessData(in <-chan *Data, out <-chan *Data) {
	for data := range in {

		tmpA := PreprocessData(data)
		tmpB := ProcessStepA(tmpA)
		tmpC := ProcessStepB(tmpB)
		out <- PostProcessData(tmpC)

	}
}

//协程方式
func ParallelProcessData(in <-chan *Data, out <-chan *Data) {
	maxCap := 100
	preOut := make(chan *Data, maxCap) //缓冲通道可以进一步优化整个过程
	stepAout := make(chan *Data, maxCap)
	stepBout := make(chan *Data, maxCap)
	stepCout := make(chan *Data, maxCap)

	//开始处理
	go PreprocessData(in, preOut)
	go ProcessStepA(preOut, stepAOut)
	go ProcessStepB(stepAOut, stepBOut)
	go ProcessStepC(stepBOut, stepCOut)
	go PostProcessData(stepCOut, out)
} */
